// 配置路由的地方
import Vue from 'vue';
import routes from './routes';
import VueRouter from 'vue-router';
import store from '@/store';
import { toPath } from 'lodash';
// 使用插件
Vue.use(VueRouter);
// 先将VueRouter原型对象的push，先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
// 重写push|replace
// 第一个参数：告诉原来push方法，你往哪里跳转
VueRouter.prototype.push = function (location, resolve, reject) {
    /* 
    call和apply区别；
    相同点：都可以调用函数一次，都可以篡改函数的上下文一次
    不同点：call与apply传递参数，call传递参数用逗号隔开，apply方法执行，传递数组。
    */
    if (resolve && reject) {
        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(this, location, () => { }, () => { });
    }
}
VueRouter.prototype.replace = function (location, resolve, reject) {

    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(this, location, () => { }, () => { });
    }
}

// 配置路由
let router = new VueRouter({
    // 配置路由
    routes,
    /* 
    滚动行为：我们可以用过这个函数来决定，跳转到新路由时，所在的位置
     */
    scrollBehavior(to, from, savedPosition) {
        return {
            // 这里的0是滚动条的位置px
            y: 0,
        }
    }
})

// 全局守卫，前置守卫，（在路由跳转之间进行判断）
router.beforeEach(async (to, from, next) => {
    // to:可以获取到你要跳转到那个路由信息
    // from：可以获取到你从那个路由而来的信息
    // next：放行函数;next(path)放行到指令路由
    let token = store.state.user.token;
    let name = store.state.user.userInfo.name;
    next();
    if (token) {
        // 如果有token表明已经登录了不能去login页面
        if (to.path == '/login') {
            next('/home')
        } else {
            // 登录，去的不是login；如果用户名已有
            if (name) {
                next();
            } else {
                // 没有用户信息
                try {
                    await store.dispatch('getUserInfo')
                    next();
                } catch (error) {
                    // token失效了获取不到用户信息，重新登录，清除token
                    await store.dispatch('userLogout');
                    next('/login');
                }
            }
        }
    } else {
        // 未登录的状态不能去我的订单之类的【pay|paysuccess】不能去个人中心
        // 未登录去上面这些路由---登录
        let toPath = to.path;
        if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay' != -1) || toPath.indexOf('/center' != -1)) {
            // 把未登录的信息添加到
            next('/login?redirect=' + toPath)
            // 然后我们就去修改登录按钮
        } else {
            next()
        }
    }
})
/* 
    路由独享守卫
    只能从购物组件到订单
    在routes.js
*/


export default router;
